package org.jeecg.modules.oms.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.oms.entity.ProductSalesOrder;
import org.jeecg.modules.oms.vo.ProductSalesOrderPageVO;
import org.jeecg.modules.oms.vo.ProductSalesOrderVO;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Map;

/**
 * 成品销售订单服务接口
 */
public interface IProductSalesOrderService extends IService<ProductSalesOrder> {

    /**
     * 分页查询成品销售订单
     *
     * @param page 分页参数
     * @param productSalesOrderPageVO 查询条件
     * @return 订单分页列表
     */
    IPage<ProductSalesOrder> getProductSalesOrderPageList(Page<ProductSalesOrder> page, ProductSalesOrderPageVO productSalesOrderPageVO);
    
    /**
     * 根据ID查询订单信息及明细
     *
     * @param id 订单ID
     * @return 订单信息及明细
     */
    ProductSalesOrderVO getProductSalesOrderById(String id);
    
    /**
     * 根据订单编号查询订单信息
     *
     * @param orderNo 订单编号
     * @return 订单信息
     */
    ProductSalesOrder getProductSalesOrderByOrderNo(String orderNo);
    
    /**
     * 添加成品销售订单
     *
     * @param productSalesOrderVO 订单信息及明细
     * @return 是否成功
     */
    boolean addProductSalesOrder(ProductSalesOrderVO productSalesOrderVO);
    
    /**
     * 编辑成品销售订单
     *
     * @param productSalesOrderVO 订单信息及明细
     * @return 是否成功
     */
    boolean editProductSalesOrder(ProductSalesOrderVO productSalesOrderVO);
    
    /**
     * 删除成品销售订单
     *
     * @param id 订单ID
     * @return 是否成功
     */
    boolean deleteProductSalesOrder(String id);
    
    /**
     * 批量删除成品销售订单
     *
     * @param ids 订单ID数组
     * @return 是否成功
     */
    boolean deleteBatchProductSalesOrder(String[] ids);
    
    /**
     * 更新订单状态
     *
     * @param id 订单ID
     * @param oldStatus 旧状态
     * @param newStatus 新状态
     * @param changePersonId 变更人ID
     * @param changeReason 变更原因
     * @return 是否成功
     */
    boolean updateOrderStatus(String id, Integer oldStatus, Integer newStatus, String changePersonId, String changeReason);
    
    /**
     * 获取最大订单编号
     *
     * @return 最大订单编号
     */
    String getMaxOrderNo();
    
    /**
     * 生成新的订单编号
     *
     * @return 新的订单编号
     */
    String generateOrderNo();
    
    /**
     * 获取订单汇总信息
     *
     * @param productSalesOrderPageVO 查询条件
     * @return 订单汇总信息，包含订单总数、总销售额、总成本、总利润
     */
    Map<String, Object> getProductSalesOrderSummary(ProductSalesOrderPageVO productSalesOrderPageVO);

    /**
     * 分页查询已审核通过的订单
     */
    IPage<ProductSalesOrderVO> pageApprovedOrders(Page<ProductSalesOrderVO> page, ProductSalesOrder order);
    
    /**
     * 获取订单详情
     */
    ProductSalesOrderVO getOrderDetail(String id);
    
    /**
     * 删除汇总单
     */
    boolean deleteSummaryFile(String orderId);
    
    /**
     * 删除优化单
     */
    boolean deleteOptimizationFile(String orderId);

    void updateSummaryOrderStatus(ProductSalesOrder order,String userId, String userName);

    void saveRequisitionInfo(String orderIds, ArrayList<String> orderNoList );
    
    /**
     * 计算并更新订单总成本
     * @param orderId 订单ID
     * @return 计算的总成本
     */
    BigDecimal calculateAndUpdateOrderTotalCost(String orderId);
    
    /**
     * 获取未生成余料入库单的订单列表
     * @return 未生成余料入库单的订单列表
     */
    IPage<ProductSalesOrderVO> getOrderListWithoutYuLiaoRuku();
}